#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
# @Date : 2024/4/28 13:46
# @Author : water
# @Description : CGI HTTP 服务器
"""
什么是CGI
    CGI 目前由NCSA维护，NCSA定义CGI如下：
        CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如：HTTP服务器，提供同客户端HTML页面的接口。
    CGI程序可以是Python脚本，PERL脚本，SHELL脚本，C或者C++程序等。
网页浏览
    为了更好的了解CGI是如何工作的，我们可以从在网页上点击一个链接或URL的流程：
    1、使用你的浏览器访问URL并连接到HTTP web 服务器。
    2、Web服务器接收到请求信息后会解析URL，并查找访问的文件在服务器上是否存在，如果存在返回文件的内容，否则返回错误信息。
    3、浏览器从服务器上接收信息，并显示接收的文件或者错误信息。
Web服务器支持及配置
    在你进行CGI编程前，确保您的Web服务器支持CGI及已经配置了CGI的处理程序。
    Apache 支持CGI 配置：
        设置好CGI目录：
            ScriptAlias /cgi-bin/ /var/www/cgi-bin/
    所有的HTTP服务器执行CGI程序都保存在一个预先配置的目录。这个目录被称为CGI目录，并按照惯例，它被命名为/var/www/cgi-bin目录。
    CGI文件的扩展名为.cgi，python也可以使用.py扩展名。
    默认情况下，Linux服务器配置运行的cgi-bin目录中为/var/www。
示例：
    如果你想指定其他运行CGI脚本的目录，可以修改httpd.conf配置文件，如下所示：
        <Directory "/var/www/cgi-bin">
           AllowOverride None
           Options +ExecCGI
           Order allow,deny
           Allow from all
        </Directory>
        在 AddHandler 中添加 .py 后缀，这样我们就可以访问 .py 结尾的 python 脚本文件：

        AddHandler cgi-script .cgi .pl .py
GET和POST方法
    浏览器客户端通过两种方法向服务器传递信息，这两种方法就是 GET 方法和 POST 方法。

    使用GET方法传输数据
        GET方法发送编码后的用户信息到服务端，数据信息包含在请求页面的URL上，以"?"号分割, 如下所示：

        http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2有关 GET 请求的其他一些注释：
            GET 请求可被缓存
            GET 请求保留在浏览器历史记录中
            GET 请求可被收藏为书签
            GET 请求不应在处理敏感数据时使用
            GET 请求有长度限制
            GET 请求只应当用于取回数据
"""


# 我们使用Python创建第一个CGI程序，文件名为hello.py，文件位于/var/www/cgi-bin目录中，内容如下
def hello():
    print("Content-type:text/html")
    print()  # 空行，告诉服务器结束头部
    print("<html>")
    print("<head>")
    print('<meta charset="utf-8">')
    print("<title>Hello World - First CGI Program</title>")
    print("</head>")
    print("<body>")
    print("<h2>Hello World! This is my first CGI program</h2>")
    print("</body>")
    print("</html>")


if __name__ == '__main__':
    hello()
